/**
 * 统一的 HTTP 请求工具函数
 * 提供 GET、POST 等请求方法，支持自定义请求头、超时设置等
 */

/**
 * 基础请求函数，封装 XMLHttpRequest 的通用逻辑
 * @param {string} method - HTTP 方法（GET、POST 等）
 * @param {string} url - 请求 URL
 * @param {Object} options - 配置选项
 * @param {*} options.data - 请求数据
 * @param {Object} options.headers - 请求头
 * @param {number} options.timeout - 超时时间（毫秒）
 * @param {Function} options.onProgress - 进度回调函数
 * @returns {Promise} - 返回 Promise 对象
 */
function request(method, url, options = {}) {
    const { data = null, headers = {}, timeout = 30000, onProgress = null } = options;
    
    return new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest();
        
        // 初始化请求
        xhr.open(method, url, true);
        
        // 设置请求头
        Object.entries(headers).forEach(([key, value]) => {
            xhr.setRequestHeader(key, value);
        });
        
        // 如果是 POST 请求且没有设置 Content-Type，默认设置为 JSON
        if (method.toUpperCase() === 'POST' && !headers['Content-Type']) {
            xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
        }
        
        // 设置超时
        xhr.timeout = timeout;
        
        // 进度监控
        if (onProgress && typeof onProgress === 'function') {
            xhr.upload.onprogress = onProgress;
        }
        
        // 响应处理
        xhr.onload = function () {
            try {
                // 尝试解析响应数据
                let response = xhr.responseText;
                const contentType = xhr.getResponseHeader('Content-Type');
                
                if (contentType && contentType.includes('application/json')) {
                    try {
                        response = JSON.parse(response);
                    } catch (e) {
                        // JSON 解析失败，但仍返回原始文本
                        console.warn(`Failed to parse response as JSON: ${e.message}`);
                    }
                }
                
                // 根据状态码判断请求是否成功
                if (xhr.status >= 200 && xhr.status < 300) {
                    resolve({
                        data: response,
                        status: xhr.status,
                        statusText: xhr.statusText,
                        headers: parseHeaders(xhr.getAllResponseHeaders())
                    });
                } else {
                    reject(new Error(`Request failed with status ${xhr.status}: ${xhr.statusText}`));
                }
            } catch (e) {
                reject(new Error(`Error processing response: ${e.message}`));
            }
        };
        
        // 错误处理
        xhr.onerror = function () {
            reject(new Error(`Network error occurred during ${method} request to ${url}`));
        };
        
        // 超时处理
        xhr.ontimeout = function () {
            reject(new Error(`Request timeout after ${timeout}ms`));
        };
        
        // 发送请求
        try {
            const body = headers['Content-Type'] && headers['Content-Type'].includes('application/json') 
                ? JSON.stringify(data) 
                : data;
            xhr.send(body);
        } catch (e) {
            reject(new Error(`Failed to send request: ${e.message}`));
        }
    });
}

/**
 * 解析响应头字符串为对象
 * @param {string} headersStr - 响应头字符串
 * @returns {Object} - 解析后的响应头对象
 */
function parseHeaders(headersStr) {
    const headers = {};
    if (!headersStr) return headers;
    
    headersStr.split('\n').forEach(line => {
        const parts = line.split(': ');
        if (parts.length >= 2) {
            const key = parts.shift().trim();
            const value = parts.join(': ').trim();
            headers[key] = value;
        }
    });
    
    return headers;
}

/**
 * 发送 GET 请求
 * @param {string} url - 请求 URL
 * @param {Object} options - 配置选项
 * @returns {Promise} - 返回 Promise 对象
 */
export function fetchDataWithGet(url, options = {}) {
    return request('GET', url, options);
}

/**
 * 发送 POST 请求
 * @param {string} url - 请求 URL
 * @param {*} data - 请求数据
 * @param {Object} options - 配置选项
 * @returns {Promise} - 返回 Promise 对象
 */
export function fetchDataWithPost(url, data, options = {}) {
    return request('POST', url, { ...options, data });
}

// 兼容旧的调用方式，不使用 export 的情况
if (typeof window !== 'undefined') {
    window.fetchDataWithGet = fetchDataWithGet;
    window.fetchDataWithPost = fetchDataWithPost;
}
